#ifndef _VISITOR_H
#define _VISITOR_H

#include "../ast/ast.decl.h"

class Visitor {
public:
    virtual void* visit(AST* node) = 0;

    virtual void* visit(ProgramAST* node) = 0;
    virtual void* visit(ProgramHeadingAST* node) = 0;
    virtual void* visit(ProgramBlockAST* node) = 0;
    virtual void* visit(BlockAST* node) = 0;
    virtual void* visit(ProgramParametersAST* node) = 0;
    virtual void* visit(IdentifierListAST* node) = 0;

    virtual void* visit(ConstantDefinitionListAST* node) = 0;
    virtual void* visit(ConstantDefinitionAST* node) = 0;
    virtual void* visit(TypeDefinitionListAST* node) = 0;
    virtual void* visit(TypeDefinitionAST* node) = 0;
    virtual void* visit(VariableDeclarationListAST* node) = 0;
    virtual void* visit(VariableDeclarationAST* node) = 0;
    virtual void* visit(ProcedureFunctionDeclarationListAST* node) = 0;
    virtual void* visit(SubprogramDeclarationAST* node) = 0;
    virtual void* visit(ProcedureDeclarationAST* node) = 0;
    virtual void* visit(ProcedureHeadingAST* node) = 0;
    virtual void* visit(ProcedureBodyAST* node) = 0;
    virtual void* visit(TypeDenoterAST* node) = 0;
    virtual void* visit(FunctionDeclarationAST* node) = 0;
    virtual void* visit(FunctionHeadingAST* node) = 0;
    virtual void* visit(FunctionBodyAST* node) = 0;
    virtual void* visit(FormalParameterListAST* node) = 0;
    virtual void* visit(FormalParameterSectionAST* node) = 0;
    virtual void* visit(ValueParameterSpecificationAST* node) = 0;
    virtual void* visit(VariableParameterSpecificationAST* node) = 0;

    virtual void* visit(ConstantAST* node) = 0;

    virtual void* visit(TypeIdentifierAST* node) = 0;
    virtual void* visit(SimpleTypeIdentifierAST* node) = 0;
    virtual void* visit(ArrayTypeAST* node) = 0;
    virtual void* visit(PeriodListAST* node) = 0;
    virtual void* visit(PeriodAST* node) = 0;
    virtual void* visit(RecordTypeAST* node) = 0;
    virtual void* visit(FieldListAST* node) = 0;
    virtual void* visit(FieldAST* node) = 0;

    virtual void* visit(StatementAST* node) = 0;
    virtual void* visit(ProcedureStatementAST* node) = 0;
    virtual void* visit(IOProcedureStatementAST* node) = 0;
    virtual void* visit(ActualParameterListAST* node) = 0;
    virtual void* visit(ReadParameterListAST* node) = 0;
    virtual void* visit(WriteParameterList* node) = 0;
    virtual void* visit(ActualParameterAST* node) = 0;
    virtual void* visit(StatementPartAST* node) = 0;
    virtual void* visit(CompoundStatement* node) = 0;
    virtual void* visit(StatementSequenceAST* node) = 0;
    virtual void* visit(EmptyStatementAST* node) = 0;
    virtual void* visit(AssignmentStatementAST* node) = 0;
    virtual void* visit(IfStatementAST* node) = 0;
    virtual void* visit(CaseStatementAST* node) = 0;
    virtual void* visit(RepeatStatementAST* node) = 0;
    virtual void* visit(WhileStatementAST* node) = 0;
    virtual void* visit(ForStatementAST* node) = 0;
    virtual void* visit(CaseListElementListAST* node) = 0;
    virtual void* visit(CaseListElementAST* node) = 0;
    virtual void* visit(CaseConstantListAST* node) = 0;

    virtual void* visit(ExpressionAST* node) = 0;
    virtual void* visit(UnsignedConstantAST* node) = 0;
    virtual void* visit(IdentifierAST* node) = 0;
    virtual void* visit(BinaryAST* node) = 0;
    virtual void* visit(IndexedVariableAST* node) = 0;
    virtual void* visit(IndexExpressionListAST* node) = 0;
    virtual void* visit(IndexExpressionAST* node) = 0;
    virtual void* visit(FieldDesignatorAST* node) = 0;
    virtual void* visit(FunctionDesignatorAST* node) = 0;
};

#endif
